package com.dkd.manage.domain.vo;


import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 * 自定义类型处理器，用于将ArrayList<VmInfo>与数据库中的JSON字符串相互转换
 * 继承自BaseTypeHandler，实现了与数据库交互的方法
 */
public class VmListTypeHandler extends BaseTypeHandler<ArrayList<VmInfo>> {

    // 使用Jackson库的对象映射器，用于JSON序列化和反序列化
    private final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 设置非空参数到PreparedStatement中
     * 将ArrayList<VmInfo>对象转换为JSON字符串，然后设置到PreparedStatement中
     *
     * @param ps        PreparedStatement对象，用于执行SQL语句
     * @param i         参数索引，指示参数的位置
     * @param parameter 要设置的参数，此处为ArrayList<VmInfo>类型
     * @param jdbcType  参数的JDBC类型，此处未使用
     * @throws SQLException 如果设置参数过程中发生错误
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, ArrayList<VmInfo> parameter, JdbcType jdbcType) throws SQLException {
        try {
            // 将ArrayList<VmInfo>对象转换为JSON字符串
            String json = objectMapper.writeValueAsString(parameter);
            // 将JSON字符串设置到PreparedStatement中
            ps.setString(i, json);
        } catch (Exception e) {
            // 如果转换过程中发生错误，抛出SQLException
            throw new SQLException("Error converting VmList to JSON", e);
        }
    }

    /**
     * 从ResultSet中获取可空结果，基于列名
     * 将JSON字符串反序列化为ArrayList<VmInfo>对象
     *
     * @param rs         ResultSet对象，包含查询结果
     * @param columnName 列名，用于定位JSON字符串
     * @return 反序列化后的ArrayList<VmInfo>对象，如果JSON字符串为null，则返回null
     * @throws SQLException 如果获取结果或反序列化过程中发生错误
     */
    @Override
    public ArrayList<VmInfo> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 从ResultSet中获取JSON字符串
        String json = rs.getString(columnName);
        if (json == null) {
            return null;
        }
        try {
            // 将JSON字符串反序列化为ArrayList<VmInfo>对象
            return objectMapper.readValue(json, new TypeReference<ArrayList<VmInfo>>() {
            });
        } catch (Exception e) {
            // 如果反序列化过程中发生错误，抛出SQLException
            throw new SQLException("Error converting JSON to VmList", e);
        }
    }

    /**
     * 从ResultSet中获取可空结果，基于列索引
     * 将JSON字符串反序列化为ArrayList<VmInfo>对象
     *
     * @param rs          ResultSet对象，包含查询结果
     * @param columnIndex 列索引，用于定位JSON字符串
     * @return 反序列化后的ArrayList<VmInfo>对象，如果JSON字符串为null，则返回null
     * @throws SQLException 如果获取结果或反序列化过程中发生错误
     */
    @Override
    public ArrayList<VmInfo> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        // 从ResultSet中获取JSON字符串
        String json = rs.getString(columnIndex);
        if (json == null) {
            return null;
        }
        try {
            // 将JSON字符串反序列化为ArrayList<VmInfo>对象
            return objectMapper.readValue(json, new TypeReference<ArrayList<VmInfo>>() {
            });
        } catch (Exception e) {
            // 如果反序列化过程中发生错误，抛出SQLException
            throw new SQLException("Error converting JSON to VmList", e);
        }
    }

    /**
     * 从CallableStatement中获取可空结果
     * 将JSON字符串反序列化为ArrayList<VmInfo>对象
     *
     * @param cs          CallableStatement对象，用于执行SQL语句
     * @param columnIndex 参数索引，指示JSON字符串的位置
     * @return 反序列化后的ArrayList<VmInfo>对象，如果JSON字符串为null，则返回null
     * @throws SQLException 如果获取结果或反序列化过程中发生错误
     */
    @Override
    public ArrayList<VmInfo> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        // 从CallableStatement中获取JSON字符串
        String json = cs.getString(columnIndex);
        if (json == null) {
            return null;
        }
        try {
            // 将JSON字符串反序列化为ArrayList<VmInfo>对象
            return objectMapper.readValue(json, new TypeReference<ArrayList<VmInfo>>() {
            });
        } catch (Exception e) {
            // 如果反序列化过程中发生错误，抛出SQLException
            throw new SQLException("Error converting JSON to VmList", e);
        }
    }
}


